#!/usr/bin/env python3

import os

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

import argparse
import sys


from spread_sheet import Spreadsheet  # type: ignore

sys.path.append("../lib")
from inner_util import prepare_dir, get_files

import datetime

DEFAULT_FONT = Font(bold=False, color="000000", size=9)
MODIFY_FONT = Font(bold=True, color="FF0000", size=9)

FILL_YELLOW = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
FILL_WHITE = PatternFill(start_color="FFFFff", end_color="FFFFff", fill_type="solid")

TARGET_DIR = "dist"


def build_font(size):
    default = Font(bold=False, color="000000", size=size)
    modify = Font(bold=True, color="FF0000", size=size)

    return {
        "default": default,
        "modify": modify,
    }


def build_target(month):
    tmp = {
        "start_row": 5,
        "max_col": 15,
        "target": f"填{month}月数据-tmp.xlsx",
        "template_name": "tmp.xlsx",
    }
    绿色铝 = {
        "start_row": 6,
        "max_col": 20,
        "target": f"XX县市区-填{month}月数据-附件3：云南省绿色铝产业建成企业运行情况调度表.xlsx",
        "template_name": "lv.xlsx",
    }

    能源外工业预计 = {
        "start_row": 5,
        "max_col": 28,
        "target": f"XX县市区-填{month}月预计数据-能源外工业投资情况预计情况表.xlsx",
        "template_name": "nengyuanwai.xlsx",
    }

    能源外工业5亿元 = {
        "start_row": 6,
        "max_col": 20,
        "target": f"XX县市区-填{month}月数据-2024年能源以外工业项目投资情况统计表（5亿元以上项目）.xlsx",
        "template_name": "51.xlsx",
    }

    工业投资预计 = {
        "start_row": 3,
        "max_col": 15,
        "target": f"XX县市区-填{month}月预计数据-工业投资运行预计.xlsx",
        "template_name": "gongye.xlsx",
    }

    新能源电池企业 = {
        "start_row": 5,
        "max_col": 18,
        "target": f"XX县市区-填{month}月数据-附件1：2024年新能源电池产业企业运行调度表.xlsx",
        "template_name": "xin2.xlsx",
    }

    新能源电池项目 = {
        "start_row": 5,
        "max_col": 21,
        "target": f"XX县市区-填{month}月数据-附件2：2024年新能源电池产业投资项目调度表（汇总).xlsx",
        "template_name": "xin1.xlsx",
    }

    新能源电池 = {
        "start_row": 4,
        "max_col": 13,
        "target": f"XX县市区-填{month}月数据-新能源电池调度表.xlsx",
        "template_name": "dianchi.xlsx",
    }

    未开工 = {
        "start_row": 7,
        "max_col": 40,
        "target": "XX县市区-附件1：未开工项目清单（玉溪）.xlsx",
        "template_name": "weikaigong.xlsx",
    }

    已开工未入库 = {
        "start_row": 7,
        "max_col": 41,
        "target": "XX县市区-附件2：已开工未入库清单（玉溪）.xlsx",
        "template_name": "yigaigongweiruku.xlsx",
    }
    投资完成滞后 = {
        "start_row": 7,
        "max_col": 42,
        "target": "XX县市区-附件3：投资完成滞后项目清单（玉溪）.xlsx",
        "template_name": "touziwanchengzhihou.xlsx",
    }

    return {
        "tmp": tmp,
        "绿色铝": 绿色铝,
        "能源外工业5亿元": 能源外工业5亿元,
        "能源外工业预计": 能源外工业预计,
        "新能源电池企业": 新能源电池企业,
        "新能源电池项目": 新能源电池项目,
        "工业投资预计": 工业投资预计,
        "新能源电池": 新能源电池,
        "未开工": 未开工,
        "已开工未入库": 已开工未入库,
        "投资完成滞后": 投资完成滞后,
    }


def build_month_dict(month):
    tmp = {}

    绿色铝 = {
        "A2": f"云南省绿色铝产业建成企业运行情况调度表（2024年{month}月）",
        "J4": f"2024年{month}月产量",
        "L4": f"2024年1-{month}月累计产量",
        "N4": f"2024年{month}月产值",
        "P4": f"2024年1-{month}月累计产值",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    能源外工业5亿元 = {
        "A2": f"云南省各州（市）2024年能源外工业项目投资情况调度表（{month}月）",
        "K3": f"填报日期：2024年{month}月20日",
        "L5": f"2023年1-{month}月完成投资",
        "N5": f"2024年1-{month}月预计完成投资",
    }

    能源外工业预计 = {
        "B2": f"1-{month}月",
        "F2": f"{month}月",
        "P4": f"{month}月预计完成投资（亿元）",
        "Q4": f"1-{month}月预计完成投资（亿元）",
        "R3": f"{month}月通过审核预计新增入库项目（个）",
        "T3": f"{month}月预计完成投资（亿元）",
        "U3": f"1-{month}月预计完成投资（亿元）",
        "H20": f"表中数据为上月，请更新为{month}月数据",
    }

    新能源电池企业 = {
        "I3": f"2024年{month}月产量",
        "K3": f"2024年1-{month}月累计产量",
        "M3": f"2024年{month}月产值",
        "O3": f"2024年1-{month}月累计产值",
    }

    新能源电池项目 = {
        "M4": f"2023年1-{month}月完成投资",
        "N4": f"2023年1-{month+1}月预计完成投资",
        "P4": f"2024年1-{month}月完成投资",
        "Q4": f"2024年{month+1}月预计完成投资",
    }

    新能源电池 = {
        "A1": f"2024年度新能源电池产业企业运行情况预测调度表（{month}月）",
        "G3": f"2024年{month-1}月",
        "H3": f"2024年{month}月",
        "I3": f"2024年1-{month}月",
        "J3": f"2023年1-{month}月",
        "H12": f"表中数据为上月，请更新为{month}月数据",
    }

    工业投资预计 = {"A1": f"工业投资预计（{month}月）"}

    未开工 = {"A3": datetime.date.today().strftime("%Y-%m-%d")}

    已开工未入库 = {
        "A3": datetime.date.today().strftime("%Y-%m-%d"),
    }

    投资完成滞后 = {
        "A3": datetime.date.today().strftime("%Y-%m-%d"),
    }

    return {
        "tmp": tmp,
        "绿色铝": 绿色铝,
        "能源外工业5亿元": 能源外工业5亿元,
        "能源外工业预计": 能源外工业预计,
        "新能源电池企业": 新能源电池企业,
        "新能源电池项目": 新能源电池项目,
        "工业投资预计": 工业投资预计,
        "新能源电池": 新能源电池,
        "未开工": 未开工,
        "已开工未入库": 已开工未入库,
        "投资完成滞后": 投资完成滞后,
    }


def parse_args():
    parser = argparse.ArgumentParser(description="汇总表格")
    parser.add_argument("--type", help="报表类型")
    parser.add_argument("--size", type=int, default=12, help="字号")
    parser.add_argument("--data", help="数据表格路径")
    parser.add_argument("--month", type=int, default=0, help="某月")
    parser.add_argument("template", help="表格模板路径")
    return parser.parse_args()


def try_file_path(file_path):
    """测试是否存在文件，如果存在，返回带括号的文件名"""
    tmp_path = file_path
    (root, ext) = os.path.splitext(file_path)
    i = 1
    while os.path.exists(tmp_path):
        tmp_path = f"{root}({i}){ext}"
        i += 1

    return tmp_path


class CollectWorkbook:
    def __init__(self, args):
        self.args = args
        self.wb = load_workbook(args.template, data_only=True)
        self.conf = build_target(self.args.month)[self.args.type]

        self.values = build_month_dict(self.args.month)[self.args.type]

    def fill_default(self):
        ws = self.wb.active
        for row in ws.iter_rows(
            min_row=self.conf["start_row"],
            max_row=ws.max_row,
            max_col=self.conf["max_col"],
        ):
            for cell in row:
                ws[cell.coordinate].font = build_font(self.args.size)["default"]
                ws[cell.coordinate].fill = FILL_WHITE

    def fill_mod(self, mod_cells):
        ws = self.wb.active
        for co in mod_cells:
            ws[co].font = build_font(self.args.size)["modify"]

            # ws[co].fill = FILL_YELLOW

    def save_as(self, target_path):
        self.wb.save(try_file_path(target_path))

    def fill_month(self):
        ws = self.wb.active

        print("Values", self.values)

        for k, v in self.values.items():
            print("Mod", k, v)
            ws[k].value = v

        target = self.conf["target"]
        template_name = self.conf["template_name"]
        self.fill_default()

        self.save_as(target)
        self.save_as(f"{TARGET_DIR}/{template_name}")
        return target


def usage():
    print("""
python3 collect.py --type 绿色铝 --size 12 模板.xlsx
""")


def main():
    usage()

    prepare_dir(TARGET_DIR, False)

    args = parse_args()

    print("Args", args)

    left = CollectWorkbook(args)

    if args.month != 0:
        left.fill_month()
        quit()

    right_files = get_files(args.data, ".xlsx")

    left_sheet = Spreadsheet(left.wb)
    for f in right_files:
        print(f"比较 {f} 和原表的差异")
        right_args = args
        right_args.template = f
        right = CollectWorkbook(right_args)
        right_sheet = Spreadsheet(right.wb)
        mod_cells = left_sheet.diff(
            right_sheet, left.conf["start_row"], left.conf["max_col"]
        )
        row_nums = [x[1:] for x in mod_cells]
        mod_row_index = list(set(row_nums))
        print(
            "Mod row",
            right_sheet.ws[f"A{mod_row_index[0]}"].value,
            mod_row_index,
        )
        left.fill_mod(mod_cells)

    left.save_as(f"汇总-{args.type}.xlsx")
    print("Done")


if __name__ == "__main__":
    main()
